//
//  EmoticonManager.swift
//  表情包
//
//  Created by miaozhihui on 2017/3/29.
//  Copyright © 2017年 DeKuTree. All rights reserved.
//

import UIKit

/// 表情管理类
class EmoticonManager {
    
    static let shared = EmoticonManager()
    
    lazy var packages = [EmoticonPackage]()
    
    private init() {
        loadPackages()
    }
}

// MARK: - 表情字符串的处理
extension EmoticonManager {
    
    func emoticonString(string: String, font: UIFont) -> NSAttributedString {
        let attrString = NSMutableAttributedString(string: string)
        // 建立正则表达式，过滤所有的表情文字
        let pattern = "\\[.*?\\]"
        guard let regx = try? NSRegularExpression(pattern: pattern, options: []) else {
            return attrString
        }
        // 匹配所有项
        let matches = regx.matches(in: string, options: [], range: NSRange(location: 0, length: attrString.length))
        // 遍历所有匹配结果
        for m in matches.reversed() {
            let r = m.rangeAt(0)
            let subStr = (attrString.string as NSString).substring(with: r)
            if let em = EmoticonManager.shared.findEmoticon(string: subStr) {
                attrString.replaceCharacters(in: r, with: em.imageText(font: font))
            }
        }
        attrString.addAttributes([NSFontAttributeName: font,NSForegroundColorAttributeName: UIColor.darkGray], range: NSRange(location: 0, length: attrString.length))
        return attrString
    }
    
    /// 根据 string 在所有的表情符号中查找对应的表情模型对象
    ///
    /// - 如果找到，返回表情模型
    /// - 否则，返回 nil
    func findEmoticon(string: String) -> Emoticon? {
        // 1.遍历表情包
        for p in packages {
            // 2.在表情数组中过滤 string 写法一
//            let result = p.emoticons.filter({ (em) -> Bool in
//                return em.chs == string
//            })
            // 尾随闭包 写法二
//            let result = p.emoticons.filter(){ (em) -> Bool in
//                return em.chs == string
//            }
            // 如果闭包中只有一句，并且是返回 写法三
            // 闭包格式定义可以省略
            // 参数省略之后，使用 $0,$1...依次替代原有的参数
//            let result = p.emoticons.filter(){
//                return $0.chs == string
//            }
            // 如果闭包中只有一句，并且是返回 写法四
            // 闭包格式定义可以省略
            // 参数省略之后，使用 $0,$1...依次替代原有的参数
            // return 也可以省略
            let result = p.emoticons.filter(){
                $0.chs == string
            }
            // 3.判断结果数组的数量
            if result.count == 1 {
                return result[0]
            }
        }
        return nil
    }
}

fileprivate extension EmoticonManager {
    func loadPackages() {
        guard let path = Bundle.main.path(forResource: "Emoticon.bundle", ofType: nil),
            let bundle = Bundle(path: path),
            let plistPath = bundle.path(forResource: "emoticons.plist", ofType: nil),
            let array = NSArray(contentsOfFile: plistPath) as? [[String:String]],
            let models = NSArray.yy_modelArray(with: EmoticonPackage.self, json: array) as? [EmoticonPackage]
            else {
            return
        }
        // 设置表情包数据
        // 使用 += 不需要再次给 packages 分配空间，直接追加数据
        packages += models
    }
}
